
package client;

import dto.ActionDTO;
import dto.ActionTypeEnum;
import dto.RespDTO;

import java.io.*;
import java.net.Socket;

public class SocketClient implements Client {
    private String host;
    private int port;

    public SocketClient(String host, int port) {
        this.host = host;
        this.port = port;
    }
//set和get方法使用ActionDTO对象与服务端进行交互，发送请求并接收响应。
    @Override
    public void set(String key, String value) {
        try (Socket socket = new Socket(host, port);
             ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
             ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
            // 传输序列化对象
            ActionDTO dto = new ActionDTO(ActionTypeEnum.SET, key, value);
            oos.writeObject(dto);
            oos.flush();
            RespDTO resp = (RespDTO) ois.readObject();
//               接收响应数据
            System.out.println("resp data: "+ resp.toString());
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
    }
//ObjectInputStream对象从Socket的输入流中读取服务端返回的数据。
//    在get方法中，发送一个ActionDTO对象给服务端，这次动作类型为GET，并且只包含键而不包含值。服务端根据这个请求处理后返回一个RespDTO对象，这个对象同样通过ois.readObject()读取，并被打印出来，显示服务端对于get操作的响应数据。
    @Override
    public String get(String key) {
        try (Socket socket = new Socket(host, port);
             ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
             ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {
            // 发送传输序列化对象
            ActionDTO dto = new ActionDTO(ActionTypeEnum.GET, key, null);
            oos.writeObject(dto);
            oos.flush();
//读取服务端的响应
            RespDTO resp = (RespDTO) ois.readObject();
            System.out.println("get数据: "+ resp.toString());
            // 接收响应数据
        } catch (IOException | ClassNotFoundException e) {
            e.printStackTrace();
        }
        return null;
    }
//补充rm方法实现删除操作
@Override
public void rm(String key) {
    try (Socket socket = new Socket(host, port);
         ObjectOutputStream oos = new ObjectOutputStream(socket.getOutputStream());
         ObjectInputStream ois = new ObjectInputStream(socket.getInputStream())) {

        // 创建一个ActionDTO实例，设置操作类型为RM，并设置key
        ActionDTO dto = new ActionDTO(ActionTypeEnum.RM, key, null);

        // 将ActionDTO对象写入输出流，发送给服务器
        oos.writeObject(dto);
        oos.flush();

        // 从输入流中读取服务器的响应
        RespDTO resp = (RespDTO) ois.readObject();

        // 打印响应信息
        System.out.println("删除操作响应: " + resp.toString());

    } catch (IOException | ClassNotFoundException e) {
        // 处理异常
        e.printStackTrace();
    }
}
}
